package es.tikitaka.dao.impl;

import java.util.List;

import javax.persistence.EntityManager;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Name;

import es.tikitaka.dao.PartEquipoService;
import es.tikitaka.domain.Temporada;
import es.tikitaka.domain.equipo.Equipo;
import es.tikitaka.domain.equipo.PartEquipo;

/**
 * 
 * @author Saúl Domínguez
 * @since 2010
 * @category PFC
 */

@Name("partEquipoService")
public class PartEquipoServiceImpl implements PartEquipoService {

	@In
	EntityManager em;

	/**
	 * Constructor por defecto
	 */
	public PartEquipoServiceImpl() {
		// TODO Auto-generated constructor stub
	}

	/**
	 * Método para listar todas las participaciones de equipos en el sistema
	 * 
	 * @return lista de participaciones
	 */
	@SuppressWarnings("unchecked")
	public List<PartEquipo> getList() {

		List<PartEquipo> list = null;
		try {
			list = em.createQuery("select p from PartEquipo p").getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 
	 * @param temporada
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<PartEquipo> getEquiposTemporada(Temporada temporada) {
		List<PartEquipo> list = null;
		try {
			list = em
					.createQuery(
							"select p from PartEquipo p left join fetch p.temporada t where t.id =?1")
					.setParameter("1", temporada.getId()).getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * Método para listar todas las participaciones de un equipo a lo largo de
	 * su trayectoria
	 * 
	 * @param equipo
	 *            Equipo al que pertenecen las participaciones
	 * @return lista de participaciones del equipo
	 */
	@SuppressWarnings("unchecked")
	public List<PartEquipo> getParticipaciones(Equipo equipo) {

		List<PartEquipo> list = null;
		try {
			list = em
					.createQuery(
							"select p from PartEquipo p left join fetch p.equipo e where e.id = ?1")
					.setParameter("1", equipo.getId()).getResultList();
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return list;
	}

	/**
	 * 
	 */
	public PartEquipo merge(PartEquipo participacion) {
		em.refresh(participacion);
		return em.merge(participacion);
	}

	/**
	 * Método para eliminar del sistema un participación de equipo dada
	 * 
	 * @param id
	 *            Id de la participación de equipo a eliminar
	 * @return estado del proceso (true or false)
	 */
	public boolean delete(Integer id) {
		boolean correcto;
		try {
			PartEquipo part = em.getReference(PartEquipo.class, id);
			em.remove(part);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}

	/**
	 * Método para guardar una participación de equipo en el sistema o las
	 * modificaciones sufridas por una participación ya existente
	 * 
	 * @param participacion
	 *            Participación de equipo a guardar
	 * @return estado el proceso (true or false)
	 */
	public boolean save(PartEquipo participacion) {
		boolean correcto;
		try {
			em.persist(participacion);
			em.flush();
			correcto = true;
		} catch (RuntimeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			correcto = false;
		}
		return correcto;
	}
}
